home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok72.lha
/
while-Interpreter
/
Source
/
QuadDrucke.MOD
< prev
next >
Wrap
Text File
|
1993-08-15
|
7KB
|
261 lines
IMPLEMENTATION MODULE QuadDrucke;
FROM InOut IMPORT Echo, Read, ReadCard, WriteCard, WriteLn, Write, WriteString;
FROM QuadLese IMPORT QuadZeile, MaxZeile, MaxBefehle, arrList, arrQuad;
PROCEDURE DruckeLeerzeichen(Zaehler : CARDINAL);
BEGIN
WHILE Zaehler # 0 DO
WriteString(" ");
DEC(Zaehler);
END;
END DruckeLeerzeichen;
PROCEDURE DruckeQuadrupel(Zeile : QuadZeile);
VAR i : CARDINAL;
BEGIN
Write("(");
WriteCard(Zeile.Zeile,2);
Write(";");
FOR i:=1 TO MaxZeile DO
IF (Zeile.Befehl[i] >= " ") AND (Zeile.Befehl[i] <= "z") THEN
Write(Zeile.Befehl[i]);
ELSE
Write(" ");
END;
END;
Write(";");
WriteCard(Zeile.IFzeile,2);
Write(";");
WriteCard(Zeile.ELSEzeile,2);
Write(")");
END DruckeQuadrupel;
PROCEDURE DruckeZuweisung(BefehlsListe : arrList;
Zeiger : CARDINAL) : CARDINAL;
BEGIN
Write("X");
INC(Zeiger);
WHILE BefehlsListe[Zeiger] # ":" DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
WriteString(":=");
INC(Zeiger);
IF BefehlsListe[Zeiger] = "X" THEN
Write("X");
INC(Zeiger);
WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
ELSE
IF (BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9") THEN
WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
ELSE
IF BefehlsListe[Zeiger] = "p" THEN
WriteString("pred");
INC(Zeiger);
WHILE BefehlsListe[Zeiger] # ")" DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
Write(")");
INC(Zeiger);
ELSE
WriteString("succ");
INC(Zeiger);
WHILE BefehlsListe[Zeiger] # ")" DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
Write(")");
INC(Zeiger);
END
END;
END;
IF BefehlsListe[Zeiger] = ";" THEN
Write(";");
INC(Zeiger);
END;
WriteLn;
RETURN Zeiger;
END DruckeZuweisung;
PROCEDURE DruckeSchleife(BefehlsListe : arrList;
Zeiger : CARDINAL ) : CARDINAL;
BEGIN
WriteString("while ");
INC(Zeiger);
WHILE BefehlsListe[Zeiger] # "#" DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
WriteString(" # ");
INC(Zeiger);
WHILE BefehlsListe[Zeiger] # "d" DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
WriteString(" do");
WriteLn;
INC(Zeiger);
RETURN Zeiger;
END DruckeSchleife;
PROCEDURE DruckeUnterprogramm(BefehlsListe : arrList;
Zeiger : CARDINAL) : CARDINAL;
BEGIN
Write("U");
INC(Zeiger);
WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
Write(BefehlsListe[Zeiger]);
INC(Zeiger);
END;
IF BefehlsListe[Zeiger] = ";" THEN
Write(";");
INC(Zeiger);
END;
WriteLn;
RETURN Zeiger;
END DruckeUnterprogramm;
PROCEDURE Drucke(BefehlsListe : arrList; QuadListe : arrQuad);
CONST Anzahl = 2;
VAR Leerzeichen, i,
While, (* Zaehler fuer noch offene 'while' Anweisungen. *)
Zaehler, (* Zaehler fuer Quadrupel-Zeilen. *)
Begin, (* Zaehler fuer noch offene 'begin' Anweisungen. *)
Zeiger : CARDINAL; (* Zeigt auf den zu druckenden Befehl. *)
Fehler : BOOLEAN; (* Wird benoetigt um die *)
(* verschachtelten IF-Anweisungen zu *)
(* vermeiden. *)
WhileBegin : ARRAY [1..MaxBefehle] OF BOOLEAN;
(* Falls ein while-begin Konstrukt aufgetreten *)
(* ist, wird dies hier vermerkt. *)
BEGIN
WriteLn;WriteLn;
FOR i:=1 TO MaxBefehle DO
WhileBegin[i]:=FALSE;
END;
Leerzeichen:=1;
While:=0;
Zaehler:=1;
Begin:=0;
Zeiger:=1;
REPEAT
Fehler:=TRUE;
IF (BefehlsListe[Zeiger] = "b") OR (BefehlsListe[Zeiger] = "e") THEN
DruckeLeerzeichen(11+MaxZeile); (* 3 Semikolons *)
(* 2 Klammern *)
(* 3 * 2 fuer Zeilennummern = 11 *)
(* + MaxZeile *)
ELSE
DruckeQuadrupel(QuadListe[Zaehler]);
INC(Zaehler);
END;
IF (BefehlsListe[Zeiger] = "b") AND Fehler THEN (* begin *)
INC(Begin);
DruckeLeerzeichen(Anzahl*Leerzeichen);
WriteString("begin");WriteLn;
INC(Leerzeichen);
INC(Zeiger);
Fehler:=FALSE;
END;
IF (BefehlsListe[Zeiger] = "e") AND Fehler THEN (* end *)
DEC(Begin);
DEC(Leerzeichen);
DruckeLeerzeichen(Anzahl*Leerzeichen);
WriteString("end");
INC(Zeiger);
IF BefehlsListe[Zeiger] = ";" THEN
Write(";");
INC(Zeiger);
END;
WriteLn;
Fehler:=FALSE;
IF While # 0 THEN (* Gehoert diese end-Anweisung zu einem *)
(* while-begin Konstrukt ??? *)
WhileBegin[While]:=FALSE;
WHILE NOT(WhileBegin[While]) AND (While >= 1) DO
DEC(Leerzeichen);
DEC(While);
END;
END;
END;
IF (BefehlsListe[Zeiger] = "X") AND Fehler THEN (* Zuweisung *)
DruckeLeerzeichen(Anzahl*Leerzeichen);
Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
Fehler:=FALSE;
END;
IF (BefehlsListe[Zeiger] = "U") AND Fehler THEN (* Unterprogramm *)
DruckeLeerzeichen(Anzahl*Leerzeichen);
Zeiger:=DruckeUnterprogramm(BefehlsListe,Zeiger);
Fehler:=FALSE;
END;
IF (BefehlsListe[Zeiger] = "w") AND Fehler THEN (* while *)
DruckeLeerzeichen(Anzahl*Leerzeichen);
Zeiger:=DruckeSchleife(BefehlsListe,Zeiger);
IF BefehlsListe[Zeiger] = "X" THEN (* while-X:=X Konstrukt *)
DruckeQuadrupel(QuadListe[Zaehler]);
INC(Zaehler);
DruckeLeerzeichen(Anzahl*(Leerzeichen+1));
Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
IF While # 0 THEN
WHILE NOT(WhileBegin[While]) AND (While >=1) DO
DEC(Leerzeichen);
DEC(While);
END;
END;
ELSE
IF BefehlsListe[Zeiger] = "w" THEN
INC(While);
INC(Leerzeichen);
ELSE (* while-begin Konstrukt *)
INC(While);
INC(Leerzeichen);
WhileBegin[While]:=TRUE;
END;
END;
Fehler:=FALSE;
END;
IF Fehler THEN
WriteLn;
WriteString("Dies ist kein while-Programm!!!");WriteLn;
HALT;
END;
UNTIL Begin = 0;
END Drucke;
END QuadDrucke.